package com.leon.learnenginespace.drools.utils;

import cn.hutool.core.date.DateUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DroolsDateUtil {
    private final static Log cLogger = LogFactory.getLog(DroolsDateUtil.class);
    public final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * 将日期字符串加 年 月 日
     * date ：日期字符串
     * num ：增加数
     * typr ：增加的类型  （年：‘year’，月：‘month’，日：‘date’）
     */
    public static String addDate(String date, int num, String type) {
        Date pasDate = null;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            pasDate = format.parse(date);
        } catch (ParseException e) {
            cLogger.error("日期-格式不匹配！" + date + ":" + e);
            return null;
        }
        Calendar ca = Calendar.getInstance();
        ca.setTime(pasDate);
        if (type.equals("year")) {
            ca.add(Calendar.YEAR, num);
        } else if (type.equals("month")) {
            ca.add(Calendar.MONTH, num);
        } else if (type.equals("date")) {
            ca.add(Calendar.DATE, num);
        } else {
            cLogger.error("类型-格式不匹配！,正确格式为 年：‘year’，月：‘month’，日：‘date’");
            return null;
        }
        Date caDate = ca.getTime();
        return format.format(caDate);
    }

    /**
     * 计算年龄方法
     *
     * @param birth yyyy-MM-dd格式出生日期
     * @return int 年龄
     */
    public static int getAgeByBirth(String birth) {
        int year = Integer.parseInt(birth.split("-")[0]);
        int month = Integer.parseInt(birth.split("-")[1]);
        int day = Integer.parseInt(birth.split("-")[2]);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());

        int yearNow = calendar.get(Calendar.YEAR);

        int age = yearNow - year;
        if ((calendar.get(Calendar.MONTH) + 1) < month) {
            age--;
        } else if ((calendar.get(Calendar.MONTH) + 1) == month) {
            if ((calendar.get(Calendar.DAY_OF_MONTH)) < day) {
                age--;
            }
        }
        return age;
    }

    /**
     * 计算年龄方法
     *
     * @param birth yyyy-MM-dd格式出生日期
     * @param today yyyy-MM-dd格式日期
     * @return int 年龄
     */
    public static int getAgeByBirth2(String birth, String today) {
        int year = Integer.parseInt(birth.split("-")[0]);
        int month = Integer.parseInt(birth.split("-")[1]);
        int day = Integer.parseInt(birth.split("-")[2]);
        Calendar calendar = Calendar.getInstance();
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            calendar.setTime(format.parse(today));
        } catch (ParseException e) {
            e.printStackTrace();
        }

        int yearNow = calendar.get(Calendar.YEAR);
        /*if (month == 2 && day == 29 && !isLeap(yearNow)) {
            day = 28;
        }*/
        int age = yearNow - year;
        if ((calendar.get(Calendar.MONTH) + 1) < month) {
            age--;
        } else if ((calendar.get(Calendar.MONTH) + 1) == month) {
            if ((calendar.get(Calendar.DAY_OF_MONTH)) < day) {
                age--;
            }
        }
        return age;
    }

    /**
     * 判断年份是否是闰年
     *
     * @param year ：年份
     * @return ：闰年：true 平年：false
     */
    public static boolean isLeap(int year) {
        if (year % 100 == 0) {
            //世纪闰年：年份是100的倍数：并且是400的倍数，是世纪闰年
            return year % 400 == 0;
        } else {
            //普通闰年：年份不是100的倍数：并且是4的倍数，是普通闰年
            return year % 4 == 0;
        }
    }

    /**
     * 判断两个日期之间是否满n年
     *
     * @param time1 ：较早的日期
     * @param time2 ：较晚的日期
     */
    public static boolean dateCompare(Date time1, Date time2, int numYear) {
        if (time1 == null || time2 == null) {
            return false;
        }
        Date time3 = add(time1, Calendar.YEAR, numYear);
        //if (time2.after(time3) || time2.equals(time3)) {
        if (time2.getTime() >= time3.getTime()) {
            return true;
        }
        return false;
    }

    /**
     * 给Date加时间
     *
     * @param calendarField ：Calendar.YEAR/ Calendar.MONTH /Calendar.DAY
     */
    public static Date add(Date date, int calendarField, int amount) {
        if (date == null) {
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(calendarField, amount);
        return c.getTime();
    }

    /**
     * 计算本次保全所在的保单年度
     *
     * @param date1 ：本次保全生效日 yyyy-MM-dd
     * @param date2 ：保单生效日 yyyy-MM-dd
     * @return ：[0]--起，[1]--止
     */
    public static String[] getInsYear(String date1, String date2) {
        String year1 = date1.substring(0, 4);
        String date22 = year1 + date2.substring(4);

        String[] arr = new String[2];
        boolean flag = false;
        try {
            flag = isAfter(date1, date22);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        if (flag) {
            //如果date1大于等于date22
            arr[0] = date22;
            arr[1] = addDate(date22, 1, "year");
        } else {
            //如果date1小于date22
            arr[0] = addDate(date22, -1, "year");
            arr[1] = date22;
        }
        return arr;
    }

    /**
     * 判断date1是否大于等于date2
     *
     * @param date1 yyyy-MM-dd
     * @param date2 yyyy-MM-dd
     * @return boolean
     */
    public static boolean isAfter(String date1, String date2) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date parse1 = format.parse(date1);
        Date parse2 = format.parse(date2);
        return parse1.getTime() >= parse2.getTime();
    }
    /**
     * 判断date1是否大于等于date2
     *
     * @param date1 yyyy-MM-dd
     * @param date2 yyyy-MM-dd
     * @return boolean
     */
    public static boolean isAfterHMS(String date1, String date2) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parse1 = format.parse(date1);
        Date parse2 = format.parse(date2);
        return parse1.getTime() >= parse2.getTime();
    }

    /**
     * 判断date1是否大于date2
     *
     * @param date1 yyyy-MM-dd
     * @param date2 yyyy-MM-dd
     * @return boolean
     */
    public static boolean isAfter2(String date1, String date2) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date parse1 = format.parse(date1);
        Date parse2 = format.parse(date2);
        return parse1.getTime() > parse2.getTime();
    }

    /**
     * 判断date是否大于当前时间
     *
     * @param date yyyy-MM-dd
     * @return boolean
     */
    public static boolean isAfterNow(String date) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date parse1 = format.parse(date);
        Date parse2 = new Date();
        return parse1.getTime() > parse2.getTime();
    }

    /**
     * 判断date是否大于等于当前时间
     *
     * @param date yyyy-MM-dd
     * @return boolean
     */
    public static boolean isAfterNow2(String date) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date parse1 = format.parse(date);
        Date parse2 = new Date();
        return parse1.getTime() >= parse2.getTime();
    }

    /**
     * 判断date1是否小于等于date2
     *
     * @param date1 yyyy-MM-dd
     * @param date2 yyyy-MM-dd
     * @return boolean
     */
    public static boolean isBefore(String date1, String date2) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date parse1 = format.parse(date1);
        Date parse2 = format.parse(date2);
        return parse1.getTime() <= parse2.getTime();
    }

    /**
     * 判断date1是否小于date2
     *
     * @param date1 yyyy-MM-dd
     * @param date2 yyyy-MM-dd
     * @return boolean
     */
    public static boolean isBefore2(String date1, String date2) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date parse1 = format.parse(date1);
        Date parse2 = format.parse(date2);
        return parse1.getTime() < parse2.getTime();
    }

    /**
     * 判断date是否小于当前时间
     *
     * @param date yyyy-MM-dd
     * @return boolean
     */
    public static boolean isBeforeNow(String date) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date parse1 = format.parse(date);
        Date parse2 = format.parse(DateUtil.now());
        return parse1.getTime() < parse2.getTime();
    }

    /**
     * 判断date是否小于等于当前时间
     *
     * @param date yyyy-MM-dd
     * @return boolean
     */
    public static boolean isBeforeNow2(String date) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date parse1 = format.parse(date);
        Date parse2 = format.parse(DateUtil.now());
        return parse1.getTime() <= parse2.getTime();
    }

    /**
     * 判断date是否在指定日期区间 [ date1 , date2 ]
     *
     * @param date  yyyy-MM-dd
     * @param date1 yyyy-MM-dd
     * @param date2 yyyy-MM-dd
     * @return boolean
     */
    public static boolean isBetween(String date, String date1, String date2) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = null;
        Date parse1 = null;
        Date parse2 = null;
        try {
            parse = format.parse(date);
            parse1 = format.parse(date1);
            parse2 = format.parse(date2);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return parse.getTime() >= parse1.getTime() && parse.getTime() <= parse2.getTime();
    }

    /**
     * 判断两个日期间隔的天数
     *
     * @param date1 较早日期 yyyy-MM-dd
     * @param date2 较晚日期 yyyy-MM-dd
     * @return 相差的天数
     */
    public static int compareDay(String date1, String date2) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        long time1 = format.parse(date1).getTime();
        long time2 = format.parse(date2).getTime();
        return (int) ((time2 - time1) / (1000 * 3600 * 24));
    }

    /**
     * 判断两个日期之间是否大于n年
     *
     * @param time1 ：较早的日期
     * @param time2 ：较晚的日期
     */
    public static boolean dateCompare2(Date time1, Date time2, int numYear) {
        if (time1 == null || time2 == null) {
            return false;
        }
        Date time3 = add(time1, Calendar.YEAR, numYear);
        if (time2.getTime() > time3.getTime()) {
            return true;
        }
        return false;
    }

    /**
     * 判断两个日期之间是否小于等于n年
     *
     * @param time1 ：较早的日期
     * @param time2 ：较晚的日期
     */
    public static boolean dateCompare3(Date time1, Date time2, int numYear) {
        if (time1 == null || time2 == null) {
            return false;
        }
        Date time3 = add(time1, Calendar.YEAR, numYear);
        if (time2.getTime() <= time3.getTime()) {
            return true;
        }
        return false;
    }

    /**
     * 判断两个日期的区间是否在大于num1年，小于等于num2年
     * @param date1
     * @param date2
     * @param num1
     * @param num2
     * @return
     */
    public static boolean dateCompare4(Date date1, Date date2,int num1, int num2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        if (dateCompare2(date1,date2,num1)) {
            if (dateCompare3(date1,date2,num2)) {
                return true;
            }
        }
        return false;
    }
}
